package accesoRepositorio;
import interfacesRemotas.*;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.*;
import modelo.gestionReserva.*;
import java.util.*;

/**
 * @version 1.0
 * @created 21-mar-2007 23:14:40
 */

public class AccesoReserva extends UnicastRemoteObject
implements InterfazReserva
{

	/**
	 * 
	 */
	private static final long serialVersionUID = -6466327559455134883L;

	public AccesoReserva() throws RemoteException
	{
		super();
	}

	public void finalize() throws Throwable {
	}

	/**
	 *
	 * @param hora
	 * @param fecha
	 * @param nombre
	 * @param id_restaurante
	 */
	public Reserva getReserva(java.util.Date hora, java.util.Date fecha, String nombre, int id_restaurante) throws RemoteException
	{
		  	    ConexionBD m_ConexionBD;
			    m_ConexionBD = new ConexionBD();
			    m_ConexionBD.abrir();


			    ResultSet rs;
	            rs = (ResultSet)m_ConexionBD
	            		.select("SELECT * FROM Reserva" +
	            				" WHERE nombre_cliente ="+nombre+
	            				" AND "
	            				);

	            Reserva m_Reserva;

	            try{
	            	rs.next();

	            	m_Reserva = new Reserva(
	            			rs.getInt("id_reserva"),
	            			rs.getInt("num_comensales"),
	            			rs.getDate("fecha_hora"),
	            			rs.getDate("fecha_hora"),
	            			rs.getString("nombre_cliente"),
	            			ServidorRMI.HOST
	            	);

	            System.out.println(rs.getInt("num_comensales")+" "+
	            			rs.getDate("fecha_hora")+" "+
	            			rs.getTime("fecha_hora")+" "+
	            			rs.getString("nombre_cliente"));
	            }catch(Exception e){
	            	System.out.println(e);
	            	 m_ConexionBD.cerrar();
	            	return null;
	            }


	            m_ConexionBD.cerrar();

	            return m_Reserva;
	}

	/**
	 *
	 * @param hora
	 * @param fecha
	 * @param nombre
	 * @param id_restaurante
	 */


	private static Mesa[] getMesas(java.util.Date hora, java.util.Date fecha, String nombre, int id_restaurante){

		int i;

		ConexionBD m_ConexionBD;
	    m_ConexionBD = new ConexionBD();
	    m_ConexionBD.abrir();
	    //AccesoMesa am=new AccesoMesa();


	    int aMesas [];
    	ArrayList<Mesa> vMesas=new ArrayList<Mesa>();
	    try{
	    	aMesas = (int[])((ResultSet)m_ConexionBD.select(
	    			"SELECT id_mesa FROM se_reservan " +
	    			"WHERE nombre_cliente='"+nombre+
	    			"' AND fecha_hora ='"+fecha+"'")).getArray(1).getArray();

	    	AccesoMesa am = new AccesoMesa();
	    	for(i=0; i<aMesas.length; i++)
	    	{
	    		vMesas.add(am.getMesa(aMesas[i]));
	    	};
	    }catch(Exception e){
	    	System.out.println(e);
	    	 m_ConexionBD.cerrar();
	    	return null;
	    }


        m_ConexionBD.cerrar();

        return (Mesa[])vMesas.toArray();
	}

	/**
	 *
	 * @param hora
	 * @param fecha
	 * @param nombre
	 * @param id_restaurante
	 */
	private static Mesa getMesaTitular(java.util.Date hora, java.util.Date fecha, String nombre, int id_restaurante)
	{
		ConexionBD m_ConexionBD;
	    m_ConexionBD = new ConexionBD();
	    m_ConexionBD.abrir();
	    //AccesoMesa am=new AccesoMesa();

	    int idMesa;

	    	ResultSet rs = (ResultSet)m_ConexionBD.select("SELECT id_mesa_titular " +
	    			"FROM Reserva " +
	    			"WHERE nombre_cliente='"+nombre+"' AND" +
	    			"fecha_hora='"+fecha+"'");

		try{
	    	rs.next();
	    	idMesa = rs.getInt(1);
	    }catch(Exception e){
	    	System.out.println(e);
	    	 m_ConexionBD.cerrar();
	    	return null;
	    }
        m_ConexionBD.cerrar();
        
        
        Mesa mlocal = null;
       	try {
			AccesoMesa am = new AccesoMesa();
			mlocal = am.getMesa(idMesa);
		} catch (RemoteException e) {
			System.err.println("Error en la clase AccesoReserva al obtener una mesa en el metodo getTitular: " + e.getMessage());
		}
		 m_ConexionBD.cerrar();
		return mlocal;
	}

	/**
	 *
	 * @param id_restaurante
	 */
	public ArrayList<Reserva> getReservas(int id_restaurante) throws RemoteException
	{
		ConexionBD m_ConexionBD;
	    m_ConexionBD = new ConexionBD();
	    m_ConexionBD.abrir();
	    AccesoMesa am = null;
		try {
			am = new AccesoMesa();
		} catch (RemoteException e1) {
			System.err.println("Error en la clase AccesoRestaurante en el metodo getReservas: " + e1.getMessage());
		}

	    ResultSet rs = (ResultSet)m_ConexionBD.select("SELECT * FROM Reserva");
		ArrayList<Reserva> vReservas = new ArrayList<Reserva>();

		try{
			while (rs.next()) {
				Reserva r = new Reserva( rs.getInt("id_reserva"),
						rs.getInt("num_comensales"),
						rs.getDate("fecha_hora"),
						rs.getTimestamp("fecha_hora"),
						rs.getString("nombre_cliente"),
						ServidorRMI.HOST);
		
				r.setMesaTitular(am.getMesa(rs.getInt("id_mesa_titular")), false);
				
				
				System.out.println("Hora de la reserva" + r.getHora());
				System.out.println("Fecha de la reserva" + r.getFecha());

				ResultSet rs2 = m_ConexionBD.select ("SELECT * FROM se_reservan WHERE id_reserva ="+ rs.getInt("id_reserva"));
				
				while (rs2.next()){
				
					if (rs2.getInt("id_mesa") != r.getIdMesaTitular()){
					
						ResultSet rs3 = m_ConexionBD.select("SELECT * FROM mesa WHERE num_mesa="+rs2.getInt("id_mesa"));
						
						while (rs3.next()){
							Mesa aux = new Mesa(rs3.getInt("num_mesa"), rs3.getString("estado"), rs3.getInt("capacidad_maxima"),
									rs3.getInt("capacidad_actual"), 1);
							
							r.setMesa(aux, false); 
						}
					
					}
				}
				vReservas.add(r);
			}
		}catch(Exception e){
			System.out.println(e);
			 m_ConexionBD.cerrar();
			return null;
		}
		
		
		
		
        m_ConexionBD.cerrar();
	    return vReservas;
	}

	/**
	 *
	 * @param nombre
	 * @param fecha
	 * @param hora
	 */
	public boolean deleteReserva (int id_reserva) throws RemoteException
	{
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();

		boolean result=true;

		result &= m_Conexion.delete("DELETE FROM se_reservan " +
				"WHERE id_reserva="+id_reserva);

		result &= m_Conexion.delete("DELETE FROM Reserva"+
					" WHERE id_reserva=" + id_reserva);

		m_Conexion.cerrar();

		return result;
	}

	/**
	 *
	 * @param nombre
	 * @param fecha
	 * @param hora
	 * @param comensales
	 */
	public boolean insertReserva(int id, String nombre, java.util.Date fecha, java.util.Date hora, int comensales) throws RemoteException
	{
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result;
		
		Timestamp t=new Timestamp(fecha.getTime());

		result = m_Conexion.insert("INSERT INTO Reserva VALUES ('"+
						nombre+"', " +  id +",'"+t.toString()+"',"+comensales+",1)");

		m_Conexion.cerrar();

		return result;
	}

	/**
	 *
	 * @param nuevos_comensales
	 * @param nueva_fecha
	 * @param nueva_hora
	 * @param nuevo_nombre
	 * @param nombre
	 * @param fecha
	 * @param hora
	 */
	public boolean updateReserva(int nuevos_comensales, java.util.Date nueva_fecha, java.util.Date nueva_hora, String nuevo_nombre, String nombre, java.util.Date fecha, java.util.Date hora) throws RemoteException
	{
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result;

		result=m_Conexion.update("UPDATE Reserva SET"+
				" nombre_cliente='"+nuevo_nombre+
				"', fecha_hora='"+nueva_fecha+
				"', num_comensales="+nuevos_comensales+
				" WHERE nombre_cliente='"+nombre+
				"' AND fecha_hora='"+fecha+"'");


		m_Conexion.cerrar();

		return result;
	}

	/**
	 *
	 * @param nombre
	 * @param fecha
	 * @param hora
	 * @param num_mesa
	 * @param id_restaurante
	 */
	public boolean deleteMesa(int id_reserva, int num_mesa, int id_restaurante) throws RemoteException
	{
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result;

		result=m_Conexion.delete("DELETE FROM se_reservan WHERE"+
				" id_reserva='"+id_reserva+
				"' AND id_mesa='"+num_mesa);

		m_Conexion.cerrar();

		return result;
	}

	/**
	 *
	 * @param nombre
	 * @param fecha
	 * @param hora
	 * @param nom_mesa
	 * @param id_restaurante
	 */
	public boolean insertMesa(int id_reserva, int num_mesa) throws RemoteException
	{
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result;

		result = m_Conexion.insert("INSERT INTO se_reservan VALUES (" +
						id_reserva+ ","+num_mesa + ")");

		m_Conexion.cerrar();

		return result;
	}

	/**
	 *
	 * @param nombre
	 * @param fecha
	 * @param hora
	 * @param id_restaurante
	 * @param num_mesa
	 */
	public boolean insertMesaTitular(int id_reserva, int num_mesa) throws RemoteException
	{
		boolean result=true;
		result &= insertMesa(id_reserva,num_mesa);
		result &= updateMesaTitular(id_reserva,num_mesa);

		return result;
	}

	/**
	 *
	 * @param nombre
	 * @param fecha
	 * @param hora
	 * @param id_restaurante
	 * @param num_mesa_nueva
	 */
	public boolean updateMesaTitular(int id_reserva, int num_mesa_nueva) throws RemoteException
	{
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result;

		result=m_Conexion.update("UPDATE RESERVA SET"+
				" id_mesa_titular="+num_mesa_nueva+
				" WHERE id_reserva="+id_reserva);

		m_Conexion.cerrar();

		return result;
	}

	public int generarId() throws RemoteException {
		// TODO Auto-generated method stub
		ConexionBD bd = new ConexionBD();
		
		bd.abrir();
		int id = bd.generaId("Reserva", "id_reserva");
		bd.cerrar();
		
		return id;
	}

	public boolean deleteMesas(int id_reserva) throws RemoteException {
		// TODO Auto-generated method stub
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result;
		
		System.out.println("Borrando las reser");

		result=m_Conexion.delete("DELETE FROM se_reservan WHERE"+
				" id_reserva="+id_reserva);

		m_Conexion.cerrar();

		return result;
	}

}
